【小ネタ】TalendでMySQLから取得したデータをストリームで処理する
DBから取得したデータをストリームで処理する
Talendを使ってDBからデータを取得する際に、データの件数が多い場合、 実行環境のマシンスペックがしょぼかったりすると処理に時間がかかったり、 最悪メモリリークが発生することがありえます。 そんな時はストリームで処理すると解決するかもしれません。
環境
今回使用した環境は以下です。
- Windows8.1 64bit
- Talend Open Studio 6.2.0
- Java 1.8
- Mysql 5.7.10
試してみる
簡単な処理を作って試してみます。 DBから取得したデータをファイル出力するという簡単なプログラムでテストします。
テストデータの件数は1,000万件で試してみました。 私の環境では、普通にやると実行数十分後にエラーが発生します。 ストリームで処理するためには、tMysqlInputコンポーネントの詳細設定タブ、ストリームの有効化にチェックを付けます。
すると、1,000万件のデータを問題なく処理できるようになりました。 チェックを付けた場合、ソースコード的には以下の1文が追加されるということしか違いがないですが、 パフォーマンスは大幅に改善されました。
((com.mysql.jdbc.Statement) stmt_tMysqlInput_1).enableStreamingResults();
Postgresの場合
じゃあPostgresの場合はどうなのかと思って、tPostgresqlInputを見てみたところ、 詳細設定タブのカーソルの使用にチェックを入れれば同じような感じで行けそうです。 実際にPostgresにも1,000万件のデータを突っ込み、tPostgresqlInputコンポーネントとtMysqlInputコンポーネントを入れ替えて試してみました。 カーソルサイズは実行環境によってベストな値が変わってくるとは思うので、色々と試してみて頂ければよいと思います。 (今回の検証環境では5000くらいが早かったです)
おわりに
TalendでETL処理を作るときは、大量にデータを読み込む場合もあるとは思います。 そんな時、メモリリークとかで処理が失敗した時の参考になれば幸いです。